package java8_NewFeature.StreamApi;

import org.junit.jupiter.api.Test;

import java.util.Arrays;
import java.util.List;
import java.util.Locale;
import java.util.Optional;
import java.util.stream.Stream;

//Stream的中间操作
public class StreamApi2 {
  //1.筛选与切片
    @Test
    void test01(){
        List<Employee> employees = EmployeeData.getEmployees();
//        创建Stream对象
        Stream<Employee> stream = employees.stream();
        //filter(Predicate p)--接受：Lambda，从中排除某些数据
        stream.filter(e -> e.sal>7000).forEach(System.out::println);
//      limit（n）--截断流，使其元素不超过给定数量
        System.out.println();
        employees.stream().limit(3).forEach(System.out::println);
//        skip(n)--跳过流，如果数据小于跳过的元素则返回空流
        System.out.println();

        employees.stream().skip(1).forEach(System.out::println);

// 去重，通过hashcode() 和、equals() 比较
        System.out.println();
        employees.stream().distinct().forEach(System.out::println);
    }

    // 2.映射
    @Test
    void test02(){
//        map(Function f) - - 接受一个函数作为参数，将元素转换成其他形式或提取信息，该函数会应用到每一个元素
        List<String> list = Arrays.asList("aa", "bb", "cc", "dd");
        list.stream().map(str -> str.toUpperCase()).forEach(System.out::println);
// 练习
        List<Employee> employees = EmployeeData.getEmployees();
        Stream<String> namesStream = employees.stream().map(e -> e.name);
        namesStream.filter(name -> name.length()>3).forEach(System.out::println);


//  flatMap(Function f)-接受一个函数作为参数，将流中的每个值都换成另一个流，然后把所有流拼接成一个流。0
    }

//    排序
   @Test
    void test03(){
//sorted()
//sorted(Comparable c)

   }

// 4. 终止操作
@Test
void test04(){
    List<Employee> employees = EmployeeData.getEmployees();

//        allMatch(Predicate p)-检查是否匹配所有元素
//    练习1.是否全体年龄大于20
    boolean allMatch = employees.stream().allMatch(e -> e.age > 20);
    System.out.println(allMatch);
//        anyMatch(Predicate p)-检查是否存在一个匹配的元素
//    练习2.是否存在薪水大于10000
    boolean anyMatch = employees.stream().anyMatch(e -> e.sal > 10000);
    System.out.println(anyMatch);

//        noneMatch(Predicate p)-检查是否没有匹配的元素
//    练习3.是否不存在以x开头的姓名
    boolean noneMatch = employees.stream().noneMatch(e -> e.name.startsWith("x"));
    System.out.println(noneMatch);

//    findfirst -- 返回流中的第一个元素
    Optional<Employee> first = employees.stream().findFirst();
    System.out.println(first);

//   findany
    Optional<Employee> any = employees.parallelStream().findAny();
    System.out.println(any);

//    count
//    练习4.工资大于6000的员工的个数
    long count = employees.stream().filter(e -> e.sal > 6000).count();
    System.out.println(count);

//    max
//    返回最高的工资
    Stream<Double> doubleStream = employees.stream().map(e -> e.sal);
    Optional<Double> max = doubleStream.max(Double::compareTo);
    System.out.println(max);
//    min
//    返回最低工资的员工
    Optional<Employee> min = employees.stream().min((e1, e2) -> Double.compare(e1.sal, e2.sal));
    System.out.println(min);

//    forEach---内部迭代
    employees.stream().forEach(System.out::println);

}

}
